package top.lixunda.ecommerce.server.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageDTO;
import top.lixunda.ecommerce.server.user.api.entity.db.PermissionDO;
import top.lixunda.ecommerce.server.user.api.entity.db.RoleDO;
import top.lixunda.ecommerce.server.user.api.entity.db.SystemMenuDO;
import top.lixunda.ecommerce.server.user.api.entity.dto.PermissionChangeDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.PermissionInsertDTO;
import top.lixunda.ecommerce.server.user.api.entity.dto.PermissionQueryDTO;

import java.util.List;

/**
 * <p>
 * 权限表，权限的最小原子单位 服务类
 * </p>
 *
 * @author Lixunda
 * @since 2020-04-24
 */
@SuppressWarnings("UnusedReturnValue")
public interface IPermissionService extends IService<PermissionDO> {

    /**
     * 插入角色权限，内部调用，当新建角色时自动插入角色自带的角色权限
     *
     * @param roleList 插入成功后的角色数据
     * @return 权限信息
     */
    List<PermissionDO> insertAutoRolePermission(List<RoleDO> roleList);

    /**
     * 插入菜单权限，内部调用，当新建菜单时自动插入菜单自带的菜单权限
     *
     * @param systemMenuList 插入成功后的菜单数据
     * @return 权限信息
     */
    List<PermissionDO> insertAutoMenuPermission(List<SystemMenuDO> systemMenuList);

    /**
     * 移除角色权限，内部调用，当移除角色时自动移除角色自带的角色权限
     *
     * @param ids 角色编号列表
     * @return 是否移除成功
     */
    Boolean removeAutoRolePermission(List<Integer> ids);

    /**
     * 移除菜单权限，内部调用，当移除菜单时自动移除菜单自带的菜单权限
     *
     * @param ids 菜单编号列表
     * @return 权限信息
     */
    Boolean removeAutoMenuPermission(List<Integer> ids);

    /**
     * 添加单独的权限，超级管理员调用
     *
     * @param insertList 权限添加数据DTO
     * @return 添加成功的权限信息
     */
    List<PermissionDO> insertPermission(List<PermissionInsertDTO> insertList);

    /**
     * 根据权限编号修改权限信息，超级管理员调用
     *
     * @param changeList 权限修改数据DTO
     * @return 修改后的权限信息
     */
    List<PermissionDO> changePermissionById(List<PermissionChangeDTO> changeList);

    /**
     * 根据权限编号删除权限信息，超级管理员调用
     *
     * @param permissionIdList 权限编号列表
     * @return 是否删除成功
     */
    Boolean removePermission(List<Integer> permissionIdList);

    /**
     * 根据权限编号查询单个权限信息，超级管理员调用
     *
     * @param id 权限编号
     * @return 单个权限信息
     */
    PermissionDO queryPermissionById(Integer id);

    /**
     * 根据多个权限编号查询多个权限信息，超级管理员调用
     *
     * @param ids 权限编号列表
     * @return 权限信息列表
     */
    List<PermissionDO> queryPermissionByIds(List<Integer> ids);

    /**
     * 条件分页查询权限数据，超级管理员调用
     *
     * @param pageDTO 分页条件DTO
     * @return 分页数据
     */
    IPage<PermissionDO> queryPermissionPageWrapper(PageDTO<PermissionDO, PermissionQueryDTO> pageDTO);
}
